home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / dev / c / mkid.lha / src / getscan.c < prev    next >
C/C++ Source or Header  |  1995-04-16  |  6KB  |  257 lines

  1. /* Copyright (c) 1986, Greg McGary */
  2. static char sccsid[] = "@(#)getscan.c    1.1 86/10/09";
  3.  
  4. #include    <stdio.h>
  5. #include    "string.h"
  6. #include    "id.h"
  7. #include    <ctype.h>
  8. #include    "extern.h"
  9.  
  10. char *getLanguage();
  11. char *(*getScanner())();
  12. void setScanArgs();
  13.  
  14. static struct sufftab *suffSlot();
  15. static struct langtab *langSlot();
  16. static void sorryNoScan();
  17.  
  18. void setAdaArgs(lang) { sorryNoScan(lang); }
  19. char *getAdaId() { setAdaArgs("ada"); return NULL; }
  20.  
  21. void setPascalArgs(lang) { sorryNoScan(lang); }
  22. char *getPascalId() { setPascalArgs("pascal"); return NULL; }
  23.  
  24. void setTextArgs(lang) { sorryNoScan(lang); }
  25. char *getTextId() { setTextArgs("plain text"); return NULL; }
  26.  
  27. void setRoffArgs(lang) { sorryNoScan(lang); }
  28. char *getRoffId() { setRoffArgs("[nt]roff"); return NULL; }
  29.  
  30. void setTeXArgs(lang) { sorryNoScan(lang); }
  31. char *getTeXId() { setTeXArgs("TeX"); return NULL; }
  32.  
  33. void setLispArgs(lang) { sorryNoScan(lang); }
  34. char *getLispId() { setLispArgs("lisp"); return NULL; }
  35.  
  36. struct langtab {
  37.     struct langtab    *lt_next;
  38.     char    *lt_name;
  39.     char    *(*lt_getid)();
  40.     void    (*lt_setargs)();
  41. };
  42.  
  43. struct sufftab {
  44.     struct sufftab    *st_next;
  45.     char    *st_suffix;
  46.     struct langtab *st_lang;
  47. };
  48.  
  49.  
  50. struct langtab langtab[] = {
  51. #define    SCAN_C        (&langtab[0])
  52. {    &langtab[1],    "c",        getCId,        setCArgs    },
  53. #define    SCAN_ASM    (&langtab[1])
  54. {    &langtab[2],    "asm",        getAsmId,    setAsmArgs    },
  55. #define    SCAN_ADA    (&langtab[2])
  56. {    &langtab[3],    "ada",        getAdaId,    setAdaArgs    },
  57. #define    SCAN_PASCAL    (&langtab[3])
  58. {    &langtab[4],    "pascal",    getPascalId,    setPascalArgs    },
  59. #define    SCAN_LISP    (&langtab[4])
  60. {    &langtab[5],    "lisp",        getLispId,    setLispArgs    },
  61. #define    SCAN_TEXT    (&langtab[5])
  62. {    &langtab[6],    "text",        getTextId,    setTextArgs    },
  63. #define    SCAN_ROFF    (&langtab[6])
  64. {    &langtab[7],    "roff",        getRoffId,    setRoffArgs    },
  65. #define    SCAN_TEX    (&langtab[7])
  66. {    &langtab[8],    "tex",        getTeXId,    setTeXArgs    },
  67. { NULL, NULL, NULL, NULL }
  68. };
  69.  
  70. /*
  71.     This is a rather incomplete list of default associations
  72.     between suffixes and languages.  You may add more to the
  73.     default list, or you may define them dynamically with the
  74.     `-S<suff>=<lang>' argument to mkid(1) and idx(1).  e.g. to
  75.     associate a `.ada' suffix with the Ada language, use
  76.     `-S.ada=ada'
  77. */
  78. struct sufftab sufftab[] = {
  79. {    &sufftab[1],    ".c",    SCAN_C        },
  80. {    &sufftab[2],    ".h",    SCAN_C        },
  81. {    &sufftab[3],    ".y",    SCAN_C        },
  82. {    &sufftab[4],    ".s",    SCAN_ASM    },
  83. {    &sufftab[5],    ".a",    SCAN_ASM    },
  84. {    &sufftab[6],    ".i",    SCAN_ASM    },
  85. {    &sufftab[7],    ".asm",    SCAN_ASM    },
  86. {    &sufftab[8],    ".p",    SCAN_PASCAL    },
  87. {    &sufftab[9],    ".pas",    SCAN_PASCAL    },
  88. { NULL, NULL, NULL },
  89. };
  90.  
  91. /*
  92.     Return an index into the langtab array for the given suffix.
  93. */
  94. static struct sufftab *
  95. suffSlot(suffix)
  96.     register char    *suffix;
  97. {
  98.     register struct sufftab    *stp;
  99.  
  100.     if (suffix == NULL)
  101.         suffix = "";
  102.  
  103.     for (stp = sufftab; stp->st_next; stp = stp->st_next)
  104.         if (strequ(stp->st_suffix, suffix))
  105.             return stp;
  106.     return stp;
  107. }
  108.  
  109. static struct langtab *
  110. langSlot(lang)
  111.     char        *lang;
  112. {
  113.     register struct langtab    *ltp;
  114.  
  115.     if (lang == NULL)
  116.         lang = "";
  117.  
  118.     for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  119.         if (strequ(ltp->lt_name, lang))
  120.             return ltp;
  121.     return ltp;
  122. }
  123.  
  124. char *
  125. getLanguage(suffix)
  126.     char        *suffix;
  127. {
  128.     struct sufftab    *stp;
  129.  
  130.     if ((stp = suffSlot(suffix))->st_next == NULL)
  131.         return NULL;
  132.     return (stp->st_lang->lt_name);
  133. }
  134.  
  135. char *(*
  136. getScanner(lang))()
  137.     char        *lang;
  138. {
  139.     struct langtab    *ltp;
  140.  
  141.     if ((ltp = langSlot(lang))->lt_next == NULL)
  142.         return NULL;
  143.     return (ltp->lt_getid);
  144. }
  145.  
  146. static void
  147. usage()
  148. {
  149.     fprintf(stderr, "Usage: %s [-S<suffix>=<lang>] [+S(+|-)<arg>] [-S<lang>(+|-)<arg>]\n", MyName);
  150.     exit(1);
  151. }
  152. void
  153. setScanArgs(op, arg)
  154.     int        op;
  155.     char        *arg;
  156. {
  157.     struct langtab    *ltp;
  158.     struct sufftab    *stp;
  159.     char        *lhs;
  160.     int        count = 0;
  161.  
  162.     lhs = arg;
  163.     while (isalnum(*arg) || *arg == '.')
  164.         arg++;
  165.  
  166.     if (strequ(lhs, "?=?")) {
  167.         for (stp = sufftab; stp->st_next; stp = stp->st_next)
  168.             printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, stp->st_lang->lt_name);
  169.         if (count)
  170.             putchar('\n');
  171.         return;
  172.     }
  173.  
  174.     if (strnequ(lhs, "?=", 2)) {
  175.         lhs += 2;
  176.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  177.             printf("No scanner for language `%s'\n", lhs);
  178.             return;
  179.         }
  180.         for (stp = sufftab; stp->st_next; stp = stp->st_next)
  181.             if (stp->st_lang == ltp)
  182.                 printf("%s%s=%s", (count++>0)?", ":"", stp->st_suffix, ltp->lt_name);
  183.         if (count)
  184.             putchar('\n');
  185.         return;
  186.     }
  187.  
  188.     if (strequ(arg, "=?")) {
  189.         lhs[strlen(lhs)-2] = '\0';
  190.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  191.             printf("No scanner assigned to suffix `%s'\n", lhs);
  192.             return;
  193.         }
  194.         printf("%s=%s\n", stp->st_suffix, stp->st_lang->lt_name);
  195.         return;
  196.     }
  197.  
  198.     if (*arg == '=') {
  199.         *arg++ = '\0';
  200.  
  201.         if ((ltp = langSlot(arg))->lt_next == NULL) {
  202.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, arg);
  203.             return;
  204.         }
  205.         if ((stp = suffSlot(lhs))->st_next == NULL) {
  206.             stp->st_suffix = lhs;
  207.             stp->st_lang = ltp;
  208.             stp->st_next = NEW(struct sufftab);
  209.         } else if (!strequ(arg, stp->st_lang->lt_name)) {
  210.             fprintf(stderr, "%s: Note: `%s=%s' overrides `%s=%s'\n", MyName, lhs, arg, lhs, stp->st_lang->lt_name);
  211.             stp->st_lang = ltp;
  212.         }
  213.         return;
  214.     }
  215.  
  216.     if (op == '+') {
  217.         switch (op = *arg++)
  218.         {
  219.         case '+':
  220.         case '-':
  221.         case '?':
  222.             break;
  223.         default:
  224.             usage();
  225.         }
  226.         for (ltp = langtab; ltp->lt_next; ltp = ltp->lt_next)
  227.             (*ltp->lt_setargs)(NULL, op, arg);
  228.         return;
  229.     }
  230.  
  231.     if (*arg == '-' || *arg == '+' || *arg == '?') {
  232.         op = *arg;
  233.         *arg++ = '\0';
  234.  
  235.         if ((ltp = langSlot(lhs))->lt_next == NULL) {
  236.             fprintf(stderr, "%s: Language undefined: %s\n", MyName, lhs);
  237.             return;
  238.         }
  239.         (*ltp->lt_setargs)(lhs, op, arg);
  240.         return;
  241.     }
  242.  
  243.     usage();
  244. }
  245.  
  246. /*
  247.     Notify user of unimplemented scanners.
  248. */
  249. static void
  250. sorryNoScan(lang)
  251.     char        *lang;
  252. {
  253.     if (lang == NULL)
  254.         return;
  255.     fprintf(stderr, "Sorry, no scanner is implemented for %s...\n", lang);
  256. }
  257.